package com.java2nb.novel.pay.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * 支付订单创建请求实体
 * 对应支付渠道接口的请求参数定义
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "PayOrderRequestVO", description = "支付订单请求参数")
public class PayOrderRequestVO {

        /**
         * 商户号
         * 备注：必填，最大长度30
         */
        @NotBlank(message = "商户号mchNo不能为空")
        @Size(max = 30, message = "商户号mchNo长度不能超过30字符")
        @ApiModelProperty(value = "商户号", required = true, example = "MCH0000001", notes = "必填，最大长度30")
        private String mchNo;

        /**
         * 应用ID
         * 备注：必填，最大长度24
         */
        @NotBlank(message = "应用ID appId不能为空")
        @Size(max = 24, message = "应用ID appId长度不能超过24字符")
        @ApiModelProperty(value = "应用ID", required = true, example = "APP0000001", notes = "必填，最大长度24")
        private String appId;

        /**
         * 商户订单号
         * 备注：必填，商户自行生成，唯一标识订单，最大长度30
         */
        @NotBlank(message = "商户订单号mchOrderNo不能为空")
        @Size(max = 30, message = "商户订单号mchOrderNo长度不能超过30字符")
        @ApiModelProperty(value = "商户订单号", required = true, example = "20230908123456789", notes = "必填，商户自行生成，唯一标识订单，最大长度30")
        private String mchOrderNo;

        /**
         * 支付方式编码
         * 备注：必填，如微信H5支付为WX_H5，最大长度30
         */
        @NotBlank(message = "支付方式wayCode不能为空")
        @Size(max = 30, message = "支付方式wayCode长度不能超过30字符")
        @ApiModelProperty(value = "支付方式编码", required = true, example = "WX_H5", notes = "必填，如微信H5支付为WX_H5，最大长度30")
        private String wayCode;

        /**
         * 支付金额
         * 备注：必填，单位为【分】，如100代表1元
         */
        @NotNull(message = "支付金额amount不能为空")
        @ApiModelProperty(value = "支付金额", required = true, example = "100", notes = "必填，单位为【分】，如100代表1元")
        private Integer amount;

        /**
         * 货币代码
         * 备注：必填，默认人民币CNY，固定3位
         */
        @NotBlank(message = "货币代码currency不能为空")
        @Size(max = 3, message = "货币代码currency长度必须为3字符")
        @ApiModelProperty(value = "货币代码", required = true, example = "CNY", notes = "必填，默认人民币CNY，固定3位", allowableValues = "CNY")
        private String currency = "cny";

        /**
         * 客户端IP
         * 备注：非必填，记录用户支付时的IPv4地址，最大长度32
         */
        @Size(max = 32, message = "客户端IP clientIp长度不能超过32字符")
        @ApiModelProperty(value = "客户端IP", example = "192.168.1.1", notes = "非必填，记录用户支付时的IPv4地址，最大长度32")
        private String clientIp;

        /**
         * 商品标题
         * 备注：必填，展示给用户的商品简短名称，最大长度64
         */
        @NotBlank(message = "商品标题subject不能为空")
        @Size(max = 64, message = "商品标题subject长度不能超过64字符")
        @ApiModelProperty(value = "商品标题", required = true, example = "会员充值", notes = "必填，展示给用户的商品简短名称，最大长度64")
        private String subject;

        /**
         * 商品描述
         * 备注：必填，商品详细说明，最大长度256
         */
        @NotBlank(message = "商品描述body不能为空")
        @Size(max = 256, message = "商品描述body长度不能超过256字符")
        @ApiModelProperty(value = "商品描述", required = true, example = "月度会员充值，有效期30天", notes = "必填，商品详细说明，最大长度256")
        private String body;

        /**
         * 异步通知地址
         * 备注：非必填，支付结果回调URL，传值才会发起回调，最大长度128
         */
        @Size(max = 128, message = "异步通知地址notifyUrl长度不能超过128字符")
        @ApiModelProperty(value = "异步通知地址", example = "https://api.example.com/notify", notes = "非必填，支付结果回调URL，传值才会发起回调，最大长度128")
        private String notifyUrl;

        /**
         * 同步跳转地址
         * 备注：非必填，支付完成后跳转回商户的URL，最大长度128
         */
        @Size(max = 128, message = "同步跳转地址returnUrl长度不能超过128字符")
        @ApiModelProperty(value = "同步跳转地址", example = "https://www.example.com/pay/success", notes = "非必填，支付完成后跳转回商户的URL，最大长度128")
        private String returnUrl;

        /**
         * 订单失效时间
         * 备注：非必填，单位【秒】，默认2小时（7200秒），超过时间订单失效
         */
        @ApiModelProperty(value = "订单失效时间", example = "7200", notes = "非必填，单位【秒】，默认2小时（7200秒），超过时间订单失效")
        private Integer expiredTime = 7200;

        /**
         * 渠道额外参数
         * 备注：非必填，特定支付渠道的扩展参数，JSON格式字符串，最大长度256
         * 示例：{"auth_code":"139209331110427"}（如条码支付的授权码）
         */
        @Size(max = 256, message = "渠道参数channelExtra长度不能超过256字符")
        @ApiModelProperty(value = "渠道额外参数", example = "{\"auth_code\":\"139209331110427\"}", notes = "非必填，特定支付渠道的扩展参数，JSON格式字符串，最大长度256")
        private String channelExtra;
}

